package main

import (
	"RedWork/gdao"
	"RedWork/rpc/userCenter/changePW"
	"RedWork/service"
	"context"
	"errors"
	"google.golang.org/grpc"
	"log"
	"net"
	"time"
)

type server struct {
	//这里将下面的对象定为父类是UnimplementedChangePWServer实现了ChangePWServer接口的mustEmbedUnimplementedChangePWServer方法
	//此对象继承了父类的方法，将父类的server方法重写
	//参考ChangePWServer接口，
	changePW.UnimplementedChangePWServer
}

func main() {
	listen, err := net.Listen("tcp", ":50002")
	if err != nil {
		log.Println("net.Listen ERR: ", err)
		return
	}

	//表示起一个grpc服务s
	s := grpc.NewServer()
	//服务s绑定对象，和一个实现了对应接口（changePWServer）的对象
	//roc的原理是注册一个对象A，在远程可以通过func("A.func()", *req) *res的形式调用
	changePW.RegisterChangePWServer(s, &server{}) //注册这一个服务
	if err = s.Serve(listen); err != nil {        //监听
		log.Println(err)
		return
	}
}

func (s *server) ChangePW(ctx context.Context, req *changePW.ChangeReq) (res *changePW.ChangeRes, err error) {
	res = &changePW.ChangeRes{
		Statue: false,
		Msg:    "",
	}
	token, userName, err := ParesToken(req.Token)
	res = &changePW.ChangeRes{
		Statue: false,
		Msg:    "",
	}
	if err != nil {
		log.Println(err)
		return
	}
	if !token {
		return
	}
	if err = gdao.ChangePassword(userName, req.NewPassword); err != nil {
		log.Println(err)
		return
	}
	return &changePW.ChangeRes{
		Statue: true,
		Msg:    "成功",
	}, nil
}

func ParesToken(token string) (ri bool, userName string, err error) {
	jwtKey := service.JWTKey{[]byte(service.PrivateKey)}
	parserToken, err := jwtKey.ParserToken(token)
	if err != nil {
		log.Println(err)
		return false, "", errors.New(err.Error() + " :token格式错误")
	}
	if time.Now().Unix() > parserToken.ExpiresAt {
		return false, "", errors.New("Token Time Out")
	}
	return true, parserToken.UserName, nil
}
